class _const(object):
    class ConstError(TypeError):
        pass  # TypeError 指对类型无效的操作

    class ConstCaseError(ConstError):
        pass

    def __setattr__(self, key, value):  # 在对类的属性赋值时会自动调用
        if key in self.__dict__:  # object.__dict__以dict的形式保存了object内所有可写的属性，name为变量名，value为变量值。
            raise self.ConstError("Can't change const.%s" % key)
        if not key.isupper():
            raise self.ConstCaseError("const name '%s' is not all uppercase" % key)
        self.__dict__[key] = value

    # TODO 对于进行常量模块进行改造，定义修改常量模块的方法
    def modify_const(self, key, value):
        if key in self.__dict__:
            if not key.isupper():
                raise self.ConstCaseError("const name '%s' is not all uppercase" % key)
            self.__dict__[key] = value
        else:
            raise self.ConstError("const.%s does not exist" % key)


import sys

sys.modules[__name__] = _const()

# sys.modules保存有当前Python环境中已经导入的模块记录，这是一个全局字典，当Python启动后就加载在内存中。
# dict的key为文件名，value为模块对象。
# __name__就是标识模块的名字的一个系统变量。

# sys.modules['const'] = _const()
# 即，让_const类作为模块的入口点，引入const.py等价于声明了一个_const类的实例。
